<?php

class FechasDias {


  static public function createHorario($inicio = 1, $fin = 24 ) {
    $options = array();
    for ($i  = $inicio ; $i <= $fin ; $i++) {
      $x = ($i < 10 ) ? "0$i" : $i;
      $options[$i] = $x;
    }
    return $options;
  }
  static public function getDiasMes($mes,$anio) {
    $dias = 0;
    $_31 = array(1,3,5,7,8,10,12);
    $_30 = array(11,4,6,9);
    if (in_array($mes,$_31)) {
      $dias = 31;
    } elseif (in_array($mes,$_30))  {
      $dias = 30;
    } elseif ($mes == 2) {
        if ( $anio / 4 == 0 ) {
          $dias = 29;
        } else {
          $dias = 28;
        }
    }
    return $dias;
  }
  static public function getDiaSemana($anio,$mes,$dia = false) {
    $dia = (! $dia ) ? 1 : $dia;
    return date('w',mktime(0,0,0,$mes,$dia,$anio));
  }
  static public function mesAnterior($mes,$anio){
    $mes_anterior = ($mes == 1) ? 12 : ($mes-1);
    return  $mes_anterior;
   }
  static public function anioAnterior($mes,$anio){
    return $anio_anterior = ($mes == 1) ? ($anio -1) : $anio;
  }
  static public function mesSiguiente($mes,$anio){
    $mes_anterior = ($mes == 12) ? 1 : ($mes+1);
    return  $mes_anterior;
   }
  static public function anioSiguiente($mes,$anio){
    return $anio_anterior = ($mes == 12) ? ($anio +1) : $anio;
  }
  static public function  getFullHora($hora) {
    $hora = ($hora<10) ? "0$hora:00" : "$hora:00";
    return $hora;
  }
  static public function armarDiasSemana($anio,$mes,$dia) {
    $ultimo_dia = self::getDiasMes($mes,$anio);
    $dias = array('0'=>(int)$dia);
    for ($i = 1 ; $i<=6 ; $i++) {
      $dia++;
      if ($dia > $ultimo_dia) {
        $dia = 1;
      }
      $dias[] = $dia;
    }
    echo "<pre>";print_r($dias);
    return $dias;
  }
  static public function armarSemanas($anio,$mes,$dia = false) {
    $primer_dia = 1;
    $ultimo_dia = self::getDiasMes($mes,$anio);
    $dia_semana = self::getDiaSemana($anio,$mes);
    $semana_actual = false;
    $semanas = array();
    $semana = 0;
    // armamos inicio del mes
    if ($dia_semana != 0 ) {
      $semana++;
      $mes_anterior = ($mes == 1) ? 12 : $mes -1;
      $anio_anterior = ($mes == 1) ? ($anio -1) : $anio;
      $dias_anterior = self::getDiasMes($mes_anterior,$anio_anterior);
      $dias_anterior = $dias_anterior - ($dia_semana)+1;
      for ($i = 0; $i < $dia_semana; $i++) {
        $semanas[$semana][] = $dias_anterior;
        $dias_anterior++;
      }
    }
    // armamos el mes actual
    for ($i = $primer_dia ; $i <= $ultimo_dia; $i++) {
      // calculamos que dia de la semana es
      $dia_semana = self::getDiaSemana($anio,$mes,$i);
      if ($dia_semana == 0) {
        $semana++;
      }
      $semanas[$semana][] = $i;
      $semana_actual = ($dia && $i == $dia) ? $semana : $semana_actual;
    }
    // armamos los proximos dias del otro mes
    $dia_semana = self::getDiaSemana($anio,$mes,$ultimo_dia);
      if ($dia_semana == 0) {
        $semana ++;
      }

    if ($dia_semana != 6) {
      $diaa = 1;
      for ($i = ($dia_semana+1) ; $i <= 6 ; $i++) {
        $semanas[$semana][] = $dia;
        $diaa++;
        $semana_actual = ($dia && $i == $dia) ? $semana : $semana_actual;
      }
    }
    if ($semana_actual) {
      $semanas = $semanas[$semana_actual];
    }
    return $semanas;
  }
  static public function nombreDia($dia){
    $nombre = "Domingo";
    switch ($dia) {
      case 1: $nombre= "Lunes";break;
      case 2: $nombre= "Martes";break;
      case 3: $nombre= "Miercoles";break;
      case 4: $nombre= "Jueves";break;
      case 5: $nombre= "Viernes";break;
      case 6: $nombre= "Sabado";break;
    }
    return $nombre;
  }
  static public function nombreMes($mes){
    switch ($mes) {
      case 1 : return "Enero"; break;
      case 2 : return "Febrero"; break;
      case 3 : return "Marzo"; break;
      case 4 : return "Abril"; break;
      case 5 : return "Mayo"; break;
      case 6 : return "Junio"; break;
      case 7 : return "Julio"; break;
      case 8 : return "Agosto"; break;
      case 9 : return "Septiembre"; break;
      case 10 : return "Octubre"; break;
      case 11 : return "Noviembre"; break;
      case 12 : return "Diciembre"; break;
    }
  }

  static public function formatoToDefault($fecha,$default = NULL) {
    $fecha = str_replace("/","-",$fecha);
    $fecha = substr($fecha,0,10);
    $f = explode("-",$fecha);
    if (count($f) != 3 || $f[0] == "" || $f[1] == "" || $f[2] == "") {
      return $default;
    } else {
      return "{$f[2]}-{$f[1]}-{$f[0]}";
    }
  }
  /**
    calcula una nueva fecha
    @param char (tipo) d = dia, m = anio, y = a�o
    @param bool (futuro) 1 si es una fecha futura y 0 si la fecha es pasada
    @param string (formato de dalida, tipo funcion date php)
    @param fecha (yyyy-mm-dd Hh-ii-ss)
    @param int (unix time)
  */
  static function calcularFecha($cantidad, $tipo = "d",$futura = 1,$formato = "Y-m-d",$fecha = false, $unixdate = false){
    $operador = ($futura == 1) ? "+" : "-";
    switch ($tipo) {
      case "d":$tiempo = "days";break;
      case "m":$tiempo = "month";break;
      case "n":$tiempo = "minutes";break;
      default: $tiempo = "year";break;
    }
    if ($fecha) {
      $inicio = mktime((int)substr($fecha,11,2),(int)substr($fecha,14,2),(int)substr($fecha,17,2),(int)substr($fecha,5,2),(int)substr($fecha,8,2),(int)substr($fecha,0,4));
    } elseif ($unixdate){
      $inicio = $unixdate;
    } else {
      $inicio = date("U");
    }
    $nuevafecha = strtotime("$operador$cantidad $tiempo",$inicio);
    $fechaFormat = date($formato,$nuevafecha);
    return $fechaFormat;
  }
}
?>
